<?php
declare (strict_types = 1);

namespace app\admin\model;

use think\Model;

/**
 * @mixin \think\Model
 */
class User extends Model
{


    //==================================== 多对多 =============================
    public function roles()
    {
        return $this->belongsToMany(Role::class, UserRole::class,'role_id','user_id');
    }

    // 多对多查询
    public function list(){

//        $user = User::find(1);
//        // 获取用户的所有角色
//        $roles = $user->roles;
//        foreach ($roles as $role) {
//            // 输出用户的角色名
//            echo $role->name;
//            // 获取中间表模型
//           // dump($role->pivot);
//        }


        // 返回用户所有角色
//        return self::with('roles')->select();

        // 多条件查询
        return self::with(['roles' => function($query) {
            $query->where('role_name','like','%学%');
        }])->where('id','=',1)->select();


    }

    // 多对多关联增加
    public function adds(){

        // 三张表[user,role,user_role]中增加数据

//        $data['city_id'] = 3;
//        $data['username'] = "dadage";
//        $data['nickname'] = "sdfs";
//        $data['password'] = "123445";
//
//        $info['role_name'] = "管理员11";
//        $info['role_code'] = "232";
//        $info['description'] = "管理员11";
//
//        return (new User())->together(['roles'=>$info])->save($data);

        // 给ID为1的用户增加角色9，10，11，12的权限
//        return self::find(1)->roles()->saveAll([9,10,11,12]);
        $user = User::find(1);
        // 增加关联的中间表数据[给1用户加一个1角色的权限]
//        $user->roles()->attach(1);
        // 传入中间表的额外属性[给1用户加一个1角色的权限，并且加一个备注说明]
//        $user->roles()->attach(1,['remark'=>'test']);
//        // 删除中间表数据[删除用户为1的1,2,3角色权限]
//        $user->roles()->detach([1,2,3]);
        // 删除中间表数据[删除用户为1的所有角色权限]
        $user->roles()->detach();

    }

    // 多对多关联更新
    // 暂时还没有看到一对多更新
    public function edit(){
        $result = (new Article())->find(5);

        $data['title'] = "张三1222222";
        $data['contents'] = "这是张三内容";
        $data['status'] = 0;

        $info['content'] = "好了好了";
        $info['article_id'] = 5;
        return $result->together(['comments'=>$info])->save($data);

    }

    // 多对多关联删除
    public function del(){
        $admins = (new Article())->with('comments')->find(5);
        return $admins->together(['comments'])->delete();
    }




    //================================ 远程一对一===============================
    public function card(){
        return $this->hasOneThrough(Archivescard::class,Archives::class,'user_id','arc_id','id','id');
    }

    public function getList(){

//        $user = User::find(1);
//        // 获取用户的档案卡
//        dump($user->card->toArray());

//         return (new User())->with('card')->select();

        // 多条件判断
        // 默认inner join 关联
        return self::with(['card' => function($query){
           $query->where('arc_id','>',0);
        }])->where('id','=',1)->select();

    }



    // ===========================Db mysql相关操作=============================

    public function getNameAttr($value, $data)
    {
        // 改性别
        //        $status = [ '0' => '女', '1' => '男'];

        // 改名称
          if($value == "张三"){
              $value = "张老大";
          }
          return $value;
    }

    // title 字段搜索器 模糊查询
    public function searchTitleAttr($query, $value, $data)
    {
        $query->where('title', 'like', '%' . $value . '%');
    }

    // create_time 字段搜索器 时间范围查询
    public function searchCreateTimeAttr($query, $value, $data)
    {
        $query->whereBetweenTime('create_time', $value[0], $value[1]);
    }

    public function searchIdAttr($query, $value, $data)
    {
        $query->where('id', '>', $value);
    }


    public function test(){

        // 搜索器使用
        // 字段限定 title create_time
//        $field = ['title', 'create_time'];
//        // 传入的数据
//        $data = [
//            'name'        => 'think',
//            'create_time' =>  ['2018-8-1','2018-8-5'],
//        ];
//        // 执行使用搜索器的查询
//        $res = self::withSearch($field, $data)->select();


        // 触发搜索器
//        $data = UserModel::field('id,username')
//            ->withSearch(['id', 'abc'], [
//                'id' => 123
//            ])
//            ->fetchSql(true)
//            ->select();


//        $data = self::where('id', '>', '0')->append(['abc'])->select()->toArray();
//        var_dump($data);


//        模型数据对象->字段名 触发获取器
//        $data = self::where('id', 4)->find();
//        var_dump($data->name);
//
//        $data = self::where('id', 1)->select();
//        foreach ($data as $v) {
//            //
//            var_dump($v->name);
//        }

//        toArray() 触发获取器
//        $data = self::where('id', 4)->find()->toArray();
//        var_dump($data);

//        $data = User::select([4, 5, 6]);
//        var_dump($data);
//        User::whereIn('id', [1, 2, 3])->select();
//        User::where('id', 'in', [1, 2, 3])->select();



        // true 数据不存在 false 查询到了数据
//        $isEmpty = User::findOrEmpty(1)->isEmpty();
//        var_dump($isEmpty);die;

//        $user = User::findOrEmpty(1);
//        var_dump($user);


        // 查询主键为1的数据
//        User::find(1);

        // 查看执行的SQL
//       echo  User::fetchSql(true)->find(4);


        // 更新的数据中包含主键使用该方式(主键就是更新条件)
        // self::update(array $data);
//        update() 直接更新
       //return self::update(['name' => 'thinkphp', 'id' => 6]);

        // 更新的数据中不包含主键使用该方式(第二个参数是更新条件)
        // self::update(array $data, array $where);
//        self::update(['name' => 'thinkphp'], ['id' => 1]);


        // 需要限定更新的字段时使用该方式(第三个参数限定需要更新的字段)
        // self::update(array $data, array $where, array $field);
//        self::update(['name' => 'thinkphp', 'email' => 'thinkphp@qq.com'], ['id' => 1], ['name']);
//
//
//        // 更新的数据包含主键 并指定更新的字段
//        self::update(['name' => 'thinkphp', 'id' => 1], [], ['content', 'status']);





        //软删除
//        批量彻底删除
//        $data = User::onlyTrashed()->select($ids);
//        foreach ($data as $v) {
//            $v->force()->delete();
//        }

//        批量恢复数据
//        $data = User::onlyTrashed()->select($ids);
//        foreach ($data as $v) {
//            $v->restore();
//        }



//        // 删除一条数据
//        self::destroy(1);
//
//        // 根据主键批量删除
//        self::destroy([1,2,3]);


//        添加成功，返回模型数据对象
        // 添加成功,返回模型数据对象
// 模型数据对象中包含 $data 数据和自增的id值
//        $res = User::create($data);

        //        会自动过滤非数据表字段
//        \app\admin\model\User::create([
//            'name' => input('post.name', '', 'trim'),
//            'number' => input('post.number', '', 'trim'),
//        ]);

//        字段没有默认值且插入一个null值会报错，捕获错误的发生
//        try {
//            self::create($data);
//        } catch (\think\db\exception\PDOException $e) {
//            halt($e->getMessage());
//        }


        // 返回true 默认只会写入数据表中有的字段
//         $result = self::save(['name' => '张三', 'number' => 111]);
//         var_dump($result);

        // 返回true allowField() 指定可以写入的字段
//        $result = self::allowField(['name', 'number'])->save(['name' => '张三', 'number' => 343, 'age' => 20]);
//        var_dump($result);

        // 官方推荐: 模型数据赋值之前就进行数据过滤
//        $data = request()->only(['number', 'name']);
//        $result = self::save($data);

//        $model = new self;
//        $model->username = '张三';
//        $model->password = 123456;
//        $result = $model->save();
//        // 自增id
//        dump($model->id);


//        如果表的主键不是 id 字段
        // 添加模型属性
//        protected $pk = 'aid'
//
//        $model = new self;
//        $model->username = '张三';
//        $model->password = 123456;
//        $result = $model->save();
//        // 自增aid
//        dump($model->aid);

    }

}
